--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
README.html 0.0.5 (22d273c2) Text, 21.37 KB
Tff7b72<!DOCTYPE html>Tb4b4b4<Tff7b72htmlTb4b4b4>Tb4b4b4<Tff7b72headTb4b4b4>Tb4b4b4<Tff7b72meta Te6edf3charsetTff7b72=Ta5d6ff"utf-8"Tb4b4b4>Tb4b4b4<Tff7b72meta Te6edf3nameTff7b72=Ta5d6ff"viewport" Te6edf3contentTff7b72=Ta5d6ff"width=device-width, initial-scale=1"Tb4b4b4>Tb4b4b4<Tff7b72styleTb4b4b4>Tb4b4b4@Tff7b72font-face Tb4b4b4{
Tff7b72font-familyTff7b72: Tff7b72octicons-anchorTff7b72;
Tff7b72srcTff7b72: Tff7b72urlTff7b72(Tff7b72httpsTff7b72:Tff7b72/Tff7b72/Tff7b72cdnjsTb4b4b4.T56d364cloudflareTb4b4b4.T56d364comTff7b72/Tff7b72ajaxTff7b72/Tff7b72libsTff7b72/Tff7b72octiconsTff7b72/Tff7b724Tb4b4b4.T56d3644Tb4b4b4.T56d3640Tff7b72/Tff7b72fontTff7b72/Tff7b72octiconsTb4b4b4.T56d364woffTff7b72) Tff7b72formatTff7b72(Ta5d6ff'woff'Tff7b72)Tff7b72;
Tb4b4b4}
Tff7b72* Tb4b4b4{
Tff7b72box-sizingTb4b4b4: Tff7b72border-boxTb4b4b4;
Tb4b4b4}
Tff7b72body Tb4b4b4{
Tff7b72widthTb4b4b4: T79c0ff980Tffa657pxTb4b4b4;
Tff7b72margin-rightTb4b4b4: Tff7b72autoTb4b4b4;
Tff7b72margin-leftTb4b4b4: Tff7b72autoTb4b4b4;
Tff7b72colorTb4b4b4:T79c0ff#333Tb4b4b4;
Tff7b72backgroundTb4b4b4:T79c0ff#fffTb4b4b4;
Tb4b4b4}
Tff7b72body Tb4b4b4.T56d364markdown-body Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff45Tffa657pxTb4b4b4;
Tff7b72borderTb4b4b4: T79c0ff1Tffa657px Tff7b72solid T79c0ff#dddTb4b4b4;
Tff7b72border-radiusTb4b4b4: T79c0ff3Tffa657pxTb4b4b4;
Tff7b72word-wrapTb4b4b4: Tff7b72break-wordTb4b4b4;
Tb4b4b4}
Tff7b72pre Tb4b4b4{
Tff7b72fontTb4b4b4: T79c0ff12Tffa657px Te6edf3ConsolasTb4b4b4, Ta5d6ff"Liberation Mono"Tb4b4b4, Te6edf3MenloTb4b4b4, Te6edf3CourierTb4b4b4, Tff7b72monospaceTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4{
Tff7b72-webkit-Te6edf3text-size-adjustTb4b4b4: T79c0ff100Tffa657%Tb4b4b4;
Te6edf3text-size-adjustTb4b4b4: T79c0ff100Tffa657%Tb4b4b4;
Tff7b72colorTb4b4b4: T79c0ff#333Tb4b4b4;
Tff7b72font-familyTb4b4b4: Ta5d6ff"Helvetica Neue"Tb4b4b4, Te6edf3HelveticaTb4b4b4, Ta5d6ff"Segoe UI"Tb4b4b4, Te6edf3ArialTb4b4b4, Te6edf3freesansTb4b4b4, Tff7b72sans-serifTb4b4b4, Ta5d6ff"Apple Color Emoji"Tb4b4b4, Ta5d6ff"Segoe UI Emoji"Tb4b4b4, Ta5d6ff"Segoe UI Symbol"Tb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff16Tffa657pxTb4b4b4;
Tff7b72line-heightTb4b4b4: T79c0ff1.6Tb4b4b4;
Tff7b72word-wrapTb4b4b4: Tff7b72break-wordTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72a Tb4b4b4{
Tff7b72background-colorTb4b4b4: Tff7b72transparentTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72aTb4b4b4:Tf0883eactiveTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72aTb4b4b4:Tf0883ehover Tb4b4b4{
Tff7b72outlineTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72strong Tb4b4b4{
Tff7b72font-weightTb4b4b4: Tff7b72boldTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h1 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff2Tffa657emTb4b4b4;
Tff7b72marginTb4b4b4: T79c0ff0.67Tffa657em T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72img Tb4b4b4{
Tff7b72borderTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72hr Tb4b4b4{
Tff7b72box-sizingTb4b4b4: Tff7b72content-boxTb4b4b4;
Tff7b72heightTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72pre Tb4b4b4{
Tff7b72overflowTb4b4b4: Tff7b72autoTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72codeTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72kbdTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72pre Tb4b4b4{
Tff7b72font-familyTb4b4b4: Tff7b72monospaceTb4b4b4, Tff7b72monospaceTb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff1Tffa657emTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72input Tb4b4b4{
Tff7b72colorTb4b4b4: Tff7b72inheritTb4b4b4;
Tff7b72fontTb4b4b4: Tff7b72inheritTb4b4b4;
Tff7b72marginTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72html Tff7b72inputTff7b72[Tff7b72disabledTff7b72] Tb4b4b4{
Tff7b72cursorTb4b4b4: Tff7b72defaultTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72input Tb4b4b4{
Tff7b72line-heightTb4b4b4: Tff7b72normalTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72inputTff7b72[Tff7b72typeTff7b72=Ta5d6ff"checkbox"Tff7b72] Tb4b4b4{
Tff7b72box-sizingTb4b4b4: Tff7b72border-boxTb4b4b4;
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72table Tb4b4b4{
Tff7b72border-collapseTb4b4b4: Tff7b72collapseTb4b4b4;
Tff7b72border-spacingTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72tdTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72th Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72input Tb4b4b4{
Tff7b72fontTb4b4b4: T79c0ff13Tffa657px Tff7b72/ T79c0ff1.4 Te6edf3HelveticaTb4b4b4, Te6edf3arialTb4b4b4, Te6edf3nimbussanslTb4b4b4, Te6edf3liberationsansTb4b4b4, Te6edf3freesansTb4b4b4, Te6edf3cleanTb4b4b4, Tff7b72sans-serifTb4b4b4, Ta5d6ff"Apple Color Emoji"Tb4b4b4, Ta5d6ff"Segoe UI Emoji"Tb4b4b4, Ta5d6ff"Segoe UI Symbol"Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72a Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#4078c0Tb4b4b4;
Tff7b72text-decorationTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72aTb4b4b4:Tf0883ehoverTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72aTb4b4b4:Tf0883eactive Tb4b4b4{
Tff7b72text-decorationTb4b4b4: Tff7b72underlineTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72hr Tb4b4b4{
Tff7b72heightTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72marginTb4b4b4: T79c0ff15Tffa657px T79c0ff0Tb4b4b4;
Tff7b72overflowTb4b4b4: Tff7b72hiddenTb4b4b4;
Tff7b72backgroundTb4b4b4: Tff7b72transparentTb4b4b4;
Tff7b72borderTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72border-bottomTb4b4b4: T79c0ff1Tffa657px Tff7b72solid T79c0ff#dddTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72hrTb4b4b4:Tf0883ebefore Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72tableTb4b4b4;
Tff7b72contentTb4b4b4: Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72hrTb4b4b4:Tf0883eafter Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72tableTb4b4b4;
Tff7b72clearTb4b4b4: Tff7b72bothTb4b4b4;
Tff7b72contentTb4b4b4: Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h1Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h2Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h3Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h4Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h5Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h6 Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff15Tffa657pxTb4b4b4;
Tff7b72margin-bottomTb4b4b4: T79c0ff15Tffa657pxTb4b4b4;
Tff7b72line-heightTb4b4b4: T79c0ff1.1Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h1 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff30Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h2 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff21Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h3 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff16Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h4 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff14Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h5 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff12Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h6 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff11Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72blockquote Tb4b4b4{
Tff7b72marginTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72ulTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ol Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72margin-topTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72margin-bottomTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72ol Tff7b72olTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ul Tff7b72ol Tb4b4b4{
Tff7b72list-style-typeTb4b4b4: Tff7b72lower-romanTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72ul Tff7b72ul Tff7b72olTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ul Tff7b72ol Tff7b72olTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ol Tff7b72ul Tff7b72olTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ol Tff7b72ol Tff7b72ol Tb4b4b4{
Tff7b72list-style-typeTb4b4b4: Tff7b72lower-alphaTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72dd Tb4b4b4{
Tff7b72margin-leftTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72code Tb4b4b4{
Tff7b72font-familyTb4b4b4: Te6edf3ConsolasTb4b4b4, Ta5d6ff"Liberation Mono"Tb4b4b4, Te6edf3MenloTb4b4b4, Te6edf3CourierTb4b4b4, Tff7b72monospaceTb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff12Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72pre Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72margin-bottomTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72fontTb4b4b4: T79c0ff12Tffa657px Te6edf3ConsolasTb4b4b4, Ta5d6ff"Liberation Mono"Tb4b4b4, Te6edf3MenloTb4b4b4, Te6edf3CourierTb4b4b4, Tff7b72monospaceTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364selectTb4b4b4::Tf0883e-ms-expand Tb4b4b4{
Tff7b72opacityTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364octicon Tb4b4b4{
Tff7b72fontTb4b4b4: Tff7b72normal Tff7b72normal Tff7b72normal T79c0ff16Tffa657pxTff7b72/T79c0ff1 Te6edf3octicons-anchorTb4b4b4;
Tff7b72displayTb4b4b4: Tff7b72inline-blockTb4b4b4;
Tff7b72text-decorationTb4b4b4: Tff7b72noneTb4b4b4;
Te6edf3text-renderingTb4b4b4: Tff7b72autoTb4b4b4;
Tff7b72-webkit-Te6edf3font-smoothingTb4b4b4: Te6edf3antialiasedTb4b4b4;
Tff7b72-moz-Te6edf3osx-font-smoothingTb4b4b4: Te6edf3grayscaleTb4b4b4;
Tff7b72-webkit-Tff7b72user-selectTb4b4b4: Tff7b72noneTb4b4b4;
Tff7b72-moz-Tff7b72user-selectTb4b4b4: Tff7b72noneTb4b4b4;
Tff7b72-ms-Tff7b72user-selectTb4b4b4: Tff7b72noneTb4b4b4;
Tff7b72user-selectTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364octicon-linkTb4b4b4:Tf0883ebefore Tb4b4b4{
Tff7b72contentTb4b4b4: Ta5d6ff'\f05c'Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-bodyTb4b4b4:Tf0883ebefore Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72tableTb4b4b4;
Tff7b72contentTb4b4b4: Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-bodyTb4b4b4:Tf0883eafter Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72tableTb4b4b4;
Tff7b72clearTb4b4b4: Tff7b72bothTb4b4b4;
Tff7b72contentTb4b4b4: Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-bodyTff7b72>Tff7b72*Tb4b4b4:Tf0883efirst-child Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff0 Tff7b72!importantTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-bodyTff7b72>Tff7b72*Tb4b4b4:Tf0883elast-child Tb4b4b4{
Tff7b72margin-bottomTb4b4b4: T79c0ff0 Tff7b72!importantTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72aTb4b4b4:Tf0883enotTff7b72(Tff7b72[Tff7b72hrefTff7b72]Tff7b72) Tb4b4b4{
Tff7b72colorTb4b4b4: Tff7b72inheritTb4b4b4;
Tff7b72text-decorationTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364anchor Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72inline-blockTb4b4b4;
Tff7b72padding-rightTb4b4b4: T79c0ff2Tffa657pxTb4b4b4;
Tff7b72margin-leftTb4b4b4: T79c0ff-18Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364anchorTb4b4b4:Tf0883efocus Tb4b4b4{
Tff7b72outlineTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h1Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h2Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h3Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h4Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h5Tff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h6 Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff1Tffa657emTb4b4b4;
Tff7b72margin-bottomTb4b4b4: T79c0ff16Tffa657pxTb4b4b4;
Tff7b72font-weightTb4b4b4: Tff7b72boldTb4b4b4;
Tff7b72line-heightTb4b4b4: T79c0ff1.4Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h1 Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h2 Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h3 Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h4 Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h5 Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h6 Tb4b4b4.T56d364octicon-link Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#000Tb4b4b4;
Tff7b72vertical-alignTb4b4b4: Tff7b72middleTb4b4b4;
Tff7b72visibilityTb4b4b4: Tff7b72hiddenTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h1Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchorTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h2Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchorTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h3Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchorTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h4Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchorTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h5Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchorTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h6Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchor Tb4b4b4{
Tff7b72text-decorationTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h1Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchor Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h2Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchor Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h3Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchor Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h4Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchor Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h5Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchor Tb4b4b4.T56d364octicon-linkTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72h6Tb4b4b4:Tf0883ehover Tb4b4b4.T56d364anchor Tb4b4b4.T56d364octicon-link Tb4b4b4{
Tff7b72visibilityTb4b4b4: Tff7b72visibleTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h1 Tb4b4b4{
Tff7b72padding-bottomTb4b4b4: T79c0ff0.3Tffa657emTb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff2.25Tffa657emTb4b4b4;
Tff7b72line-heightTb4b4b4: T79c0ff1.2Tb4b4b4;
Tff7b72border-bottomTb4b4b4: T79c0ff1Tffa657px Tff7b72solid T79c0ff#eeeTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h1 Tb4b4b4.T56d364anchor Tb4b4b4{
Tff7b72line-heightTb4b4b4: T79c0ff1Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h2 Tb4b4b4{
Tff7b72padding-bottomTb4b4b4: T79c0ff0.3Tffa657emTb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff1.75Tffa657emTb4b4b4;
Tff7b72line-heightTb4b4b4: T79c0ff1.225Tb4b4b4;
Tff7b72border-bottomTb4b4b4: T79c0ff1Tffa657px Tff7b72solid T79c0ff#eeeTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h2 Tb4b4b4.T56d364anchor Tb4b4b4{
Tff7b72line-heightTb4b4b4: T79c0ff1Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h3 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff1.5Tffa657emTb4b4b4;
Tff7b72line-heightTb4b4b4: T79c0ff1.43Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h3 Tb4b4b4.T56d364anchor Tb4b4b4{
Tff7b72line-heightTb4b4b4: T79c0ff1.2Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h4 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff1.25Tffa657emTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h4 Tb4b4b4.T56d364anchor Tb4b4b4{
Tff7b72line-heightTb4b4b4: T79c0ff1.2Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h5 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff1Tffa657emTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h5 Tb4b4b4.T56d364anchor Tb4b4b4{
Tff7b72line-heightTb4b4b4: T79c0ff1.1Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h6 Tb4b4b4{
Tff7b72font-sizeTb4b4b4: T79c0ff1Tffa657emTb4b4b4;
Tff7b72colorTb4b4b4: T79c0ff#777Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72h6 Tb4b4b4.T56d364anchor Tb4b4b4{
Tff7b72line-heightTb4b4b4: T79c0ff1.1Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72pTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72blockquoteTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ulTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72olTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72dlTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72tableTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72pre Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72margin-bottomTb4b4b4: T79c0ff16Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72hr Tb4b4b4{
Tff7b72heightTb4b4b4: T79c0ff4Tffa657pxTb4b4b4;
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72marginTb4b4b4: T79c0ff16Tffa657px T79c0ff0Tb4b4b4;
Tff7b72background-colorTb4b4b4: T79c0ff#e7e7e7Tb4b4b4;
Tff7b72borderTb4b4b4: T79c0ff0 Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72ulTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ol Tb4b4b4{
Tff7b72padding-leftTb4b4b4: T79c0ff2Tffa657emTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72ul Tff7b72ulTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ul Tff7b72olTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ol Tff7b72olTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72ol Tff7b72ul Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72margin-bottomTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72liTff7b72>Tff7b72p Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff16Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72dl Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72dl Tff7b72dt Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72margin-topTb4b4b4: T79c0ff16Tffa657pxTb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff1Tffa657emTb4b4b4;
Tff7b72font-styleTb4b4b4: Tff7b72italicTb4b4b4;
Tff7b72font-weightTb4b4b4: Tff7b72boldTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72dl Tff7b72dd Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff0 T79c0ff16Tffa657pxTb4b4b4;
Tff7b72margin-bottomTb4b4b4: T79c0ff16Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72blockquote Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff0 T79c0ff15Tffa657pxTb4b4b4;
Tff7b72colorTb4b4b4: T79c0ff#777Tb4b4b4;
Tff7b72border-leftTb4b4b4: T79c0ff4Tffa657px Tff7b72solid T79c0ff#dddTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72blockquoteTff7b72>Tb4b4b4:Tf0883efirst-child Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72blockquoteTff7b72>Tb4b4b4:Tf0883elast-child Tb4b4b4{
Tff7b72margin-bottomTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72table Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72blockTb4b4b4;
Tff7b72widthTb4b4b4: T79c0ff100Tffa657%Tb4b4b4;
Tff7b72overflowTb4b4b4: Tff7b72autoTb4b4b4;
Tff7b72word-breakTb4b4b4: Tff7b72normalTb4b4b4;
Tff7b72word-breakTb4b4b4: Te6edf3keep-allTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72table Tff7b72th Tb4b4b4{
Tff7b72font-weightTb4b4b4: Tff7b72boldTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72table Tff7b72thTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72table Tff7b72td Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff6Tffa657px T79c0ff13Tffa657pxTb4b4b4;
Tff7b72borderTb4b4b4: T79c0ff1Tffa657px Tff7b72solid T79c0ff#dddTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72table Tff7b72tr Tb4b4b4{
Tff7b72background-colorTb4b4b4: T79c0ff#fffTb4b4b4;
Tff7b72border-topTb4b4b4: T79c0ff1Tffa657px Tff7b72solid T79c0ff#cccTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72table Tff7b72trTb4b4b4:Tf0883enth-childTff7b72(Tff7b722nTff7b72) Tb4b4b4{
Tff7b72background-colorTb4b4b4: T79c0ff#f8f8f8Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72img Tb4b4b4{
Tff7b72max-widthTb4b4b4: T79c0ff100Tffa657%Tb4b4b4;
Tff7b72box-sizingTb4b4b4: Tff7b72content-boxTb4b4b4;
Tff7b72background-colorTb4b4b4: T79c0ff#fffTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72code Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72padding-topTb4b4b4: T79c0ff0.2Tffa657emTb4b4b4;
Tff7b72padding-bottomTb4b4b4: T79c0ff0.2Tffa657emTb4b4b4;
Tff7b72marginTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff85Tffa657%Tb4b4b4;
Tff7b72background-colorTb4b4b4: Tffa657rgbaTb4b4b4(T79c0ff0Tb4b4b4,T79c0ff0Tb4b4b4,T79c0ff0Tb4b4b4,T79c0ff0.04Tb4b4b4)Tb4b4b4;
Tff7b72border-radiusTb4b4b4: T79c0ff3Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72codeTb4b4b4:Tf0883ebeforeTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72codeTb4b4b4:Tf0883eafter Tb4b4b4{
Tff7b72letter-spacingTb4b4b4: T79c0ff-0.2Tffa657emTb4b4b4;
Tff7b72contentTb4b4b4: Ta5d6ff"\00a0"Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72preTff7b72>Tff7b72code Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72marginTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff100Tffa657%Tb4b4b4;
Tff7b72word-breakTb4b4b4: Tff7b72normalTb4b4b4;
Tff7b72white-spaceTb4b4b4: Tff7b72preTb4b4b4;
Tff7b72backgroundTb4b4b4: Tff7b72transparentTb4b4b4;
Tff7b72borderTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364highlight Tb4b4b4{
Tff7b72margin-bottomTb4b4b4: T79c0ff16Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364highlight Tff7b72preTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72pre Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff16Tffa657pxTb4b4b4;
Tff7b72overflowTb4b4b4: Tff7b72autoTb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff85Tffa657%Tb4b4b4;
Tff7b72line-heightTb4b4b4: T79c0ff1.45Tb4b4b4;
Tff7b72background-colorTb4b4b4: T79c0ff#f7f7f7Tb4b4b4;
Tff7b72border-radiusTb4b4b4: T79c0ff3Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364highlight Tff7b72pre Tb4b4b4{
Tff7b72margin-bottomTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72word-breakTb4b4b4: Tff7b72normalTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72pre Tb4b4b4{
Tff7b72word-wrapTb4b4b4: Tff7b72normalTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72pre Tff7b72code Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72inlineTb4b4b4;
Tff7b72max-widthTb4b4b4: Tff7b72initialTb4b4b4;
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72marginTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72overflowTb4b4b4: Tff7b72initialTb4b4b4;
Tff7b72line-heightTb4b4b4: Tff7b72inheritTb4b4b4;
Tff7b72word-wrapTb4b4b4: Tff7b72normalTb4b4b4;
Tff7b72background-colorTb4b4b4: Tff7b72transparentTb4b4b4;
Tff7b72borderTb4b4b4: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72pre Tff7b72codeTb4b4b4:Tf0883ebeforeTff7b72,
Tb4b4b4.T56d364markdown-body Tff7b72pre Tff7b72codeTb4b4b4:Tf0883eafter Tb4b4b4{
Tff7b72contentTb4b4b4: Tff7b72normalTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72kbd Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72inline-blockTb4b4b4;
Tff7b72paddingTb4b4b4: T79c0ff3Tffa657px T79c0ff5Tffa657pxTb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff11Tffa657pxTb4b4b4;
Tff7b72line-heightTb4b4b4: T79c0ff10Tffa657pxTb4b4b4;
Tff7b72colorTb4b4b4: T79c0ff#555Tb4b4b4;
Tff7b72vertical-alignTb4b4b4: Tff7b72middleTb4b4b4;
Tff7b72background-colorTb4b4b4: T79c0ff#fcfcfcTb4b4b4;
Tff7b72borderTb4b4b4: Tff7b72solid T79c0ff1Tffa657px T79c0ff#cccTb4b4b4;
Tff7b72border-bottom-colorTb4b4b4: T79c0ff#bbbTb4b4b4;
Tff7b72border-radiusTb4b4b4: T79c0ff3Tffa657pxTb4b4b4;
Tff7b72box-shadowTb4b4b4: Tff7b72inset T79c0ff0 T79c0ff-1Tffa657px T79c0ff0 T79c0ff#bbbTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-c Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#969896Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-c1Tff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-s Tb4b4b4.T56d364pl-v Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#0086b3Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-eTff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-en Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#795da3Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-s Tb4b4b4.T56d364pl-s1Tff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-smi Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#333Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-ent Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#63a35cTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-k Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#a71d5dTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-pdsTff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-sTff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-s Tb4b4b4.T56d364pl-pse Tb4b4b4.T56d364pl-s1Tff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-srTff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-sr Tb4b4b4.T56d364pl-cceTff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-sr Tb4b4b4.T56d364pl-sraTff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-sr Tb4b4b4.T56d364pl-sre Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#183691Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-v Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#ed6a43Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-id Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#b52a1dTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-ii Tb4b4b4{
Tff7b72background-colorTb4b4b4: T79c0ff#b52a1dTb4b4b4;
Tff7b72colorTb4b4b4: T79c0ff#f8f8f8Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-sr Tb4b4b4.T56d364pl-cce Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#63a35cTb4b4b4;
Tff7b72font-weightTb4b4b4: Tff7b72boldTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-ml Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#693a17Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-mhTff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-mh Tb4b4b4.T56d364pl-enTff7b72,
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-ms Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#1d3e81Tb4b4b4;
Tff7b72font-weightTb4b4b4: Tff7b72boldTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-mq Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#008080Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-mi Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#333Tb4b4b4;
Tff7b72font-styleTb4b4b4: Tff7b72italicTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-mb Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#333Tb4b4b4;
Tff7b72font-weightTb4b4b4: Tff7b72boldTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-md Tb4b4b4{
Tff7b72background-colorTb4b4b4: T79c0ff#ffececTb4b4b4;
Tff7b72colorTb4b4b4: T79c0ff#bd2c00Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-mi1 Tb4b4b4{
Tff7b72background-colorTb4b4b4: T79c0ff#eaffeaTb4b4b4;
Tff7b72colorTb4b4b4: T79c0ff#55a532Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-mdr Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#795da3Tb4b4b4;
Tff7b72font-weightTb4b4b4: Tff7b72boldTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364pl-mo Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#1d3e81Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tff7b72kbd Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72inline-blockTb4b4b4;
Tff7b72paddingTb4b4b4: T79c0ff3Tffa657px T79c0ff5Tffa657pxTb4b4b4;
Tff7b72fontTb4b4b4: T79c0ff11Tffa657px Te6edf3ConsolasTb4b4b4, Ta5d6ff"Liberation Mono"Tb4b4b4, Te6edf3MenloTb4b4b4, Te6edf3CourierTb4b4b4, Tff7b72monospaceTb4b4b4;
Tff7b72line-heightTb4b4b4: T79c0ff10Tffa657pxTb4b4b4;
Tff7b72colorTb4b4b4: T79c0ff#555Tb4b4b4;
Tff7b72vertical-alignTb4b4b4: Tff7b72middleTb4b4b4;
Tff7b72background-colorTb4b4b4: T79c0ff#fcfcfcTb4b4b4;
Tff7b72borderTb4b4b4: Tff7b72solid T79c0ff1Tffa657px T79c0ff#cccTb4b4b4;
Tff7b72border-bottom-colorTb4b4b4: T79c0ff#bbbTb4b4b4;
Tff7b72border-radiusTb4b4b4: T79c0ff3Tffa657pxTb4b4b4;
Tff7b72box-shadowTb4b4b4: Tff7b72inset T79c0ff0 T79c0ff-1Tffa657px T79c0ff0 T79c0ff#bbbTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364plan-price-unit Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#767676Tb4b4b4;
Tff7b72font-weightTb4b4b4: Tff7b72normalTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364task-list-item Tb4b4b4{
Tff7b72list-style-typeTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364task-list-itemTff7b72+Tb4b4b4.T56d364task-list-item Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff3Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364task-list-item Tff7b72input Tb4b4b4{
Tff7b72marginTb4b4b4: T79c0ff0 T79c0ff0.35Tffa657em T79c0ff0.25Tffa657em T79c0ff-1.6Tffa657emTb4b4b4;
Tff7b72vertical-alignTb4b4b4: Tff7b72middleTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364plan-choice Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff15Tffa657pxTb4b4b4;
Tff7b72padding-leftTb4b4b4: T79c0ff40Tffa657pxTb4b4b4;
Tff7b72displayTb4b4b4: Tff7b72blockTb4b4b4;
Tff7b72borderTb4b4b4: T79c0ff1Tffa657px Tff7b72solid T79c0ff#e0e0e0Tb4b4b4;
Tff7b72positionTb4b4b4: Tff7b72relativeTb4b4b4;
Tff7b72font-weightTb4b4b4: Tff7b72normalTb4b4b4;
Tff7b72background-colorTb4b4b4: T79c0ff#fafafaTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364plan-choiceTb4b4b4.T56d364open Tb4b4b4{
Tff7b72background-colorTb4b4b4: T79c0ff#fffTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364plan-choiceTb4b4b4.T56d364open Tb4b4b4.T56d364plan-choice-seat-breakdown Tb4b4b4{
Tff7b72displayTb4b4b4: Tff7b72blockTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364plan-choice-free Tb4b4b4{
Tff7b72border-radiusTb4b4b4: T79c0ff3Tffa657px T79c0ff3Tffa657px T79c0ff0 T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364plan-choice-paid Tb4b4b4{
Tff7b72border-radiusTb4b4b4: T79c0ff0 T79c0ff0 T79c0ff3Tffa657px T79c0ff3Tffa657pxTb4b4b4;
Tff7b72border-topTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72margin-bottomTb4b4b4: T79c0ff20Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364plan-choice-radio Tb4b4b4{
Tff7b72positionTb4b4b4: Tff7b72absoluteTb4b4b4;
Tff7b72leftTb4b4b4: T79c0ff15Tffa657pxTb4b4b4;
Tff7b72topTb4b4b4: T79c0ff18Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364plan-choice-exp Tb4b4b4{
Tff7b72colorTb4b4b4: T79c0ff#999Tb4b4b4;
Tff7b72font-sizeTb4b4b4: T79c0ff12Tffa657pxTb4b4b4;
Tff7b72margin-topTb4b4b4: T79c0ff5Tffa657pxTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4.T56d364plan-choice-seat-breakdown Tb4b4b4{
Tff7b72margin-topTb4b4b4: T79c0ff10Tffa657pxTb4b4b4;
Tff7b72displayTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364markdown-body Tb4b4b4:Tf0883echeckedTff7b72+Tb4b4b4.T56d364radio-label Tb4b4b4{
Tff7b72z-indexTb4b4b4: T79c0ff1Tb4b4b4;
Tff7b72positionTb4b4b4: Tff7b72relativeTb4b4b4;
Tff7b72border-colorTb4b4b4: T79c0ff#4078c0Tb4b4b4;
Tb4b4b4}
Tb4b4b4@Tff7b72media Tff7b72print Tb4b4b4{
Tff7b72body Tb4b4b4.T56d364markdown-body Tb4b4b4{
Tff7b72paddingTb4b4b4: T79c0ff0Tb4b4b4;
Tff7b72borderTb4b4b4: Tff7b72noneTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4<Tb4b4b4/Tff7b72styleTb4b4b4>Tb4b4b4<Tff7b72titleTb4b4b4>READMETb4b4b4<Tb4b4b4/Tff7b72titleTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72headTb4b4b4>Tb4b4b4<Tff7b72bodyTb4b4b4>Tb4b4b4<Tff7b72article Te6edf3classTff7b72=Ta5d6ff"markdown-body"Tb4b4b4>Tb4b4b4<Tff7b72h1Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-lightweight-extensible-message-format" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#lightweight-extensible-message-format" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>Lightweight Extensible Message FormatTb4b4b4<Tb4b4b4/Tff7b72h1Tb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>LXMF is a simple and flexible messaging format that allows a wide variety of implementations, while using as little bandwidth as possible. It is built on top of Tb4b4b4<Tff7b72a Te6edf3hrefTff7b72=Ta5d6ff"https://github.com/markqvist/reticulum"Tb4b4b4>ReticulumTb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4> and offers zero-conf message routing, end-to-end encryption and Perfect Forward Secrecy by default.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-structure" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#structure" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>StructureTb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>LXMF messages are stored in a simple and efficient format, that's easy to parse and write.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72h5Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-the-format-follows-this-general-structure" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#the-format-follows-this-general-structure" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>The format follows this general structure:Tb4b4b4<Tb4b4b4/Tff7b72h5Tb4b4b4>
Tb4b4b4<Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>DestinationTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>SourceTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>RSA SignatureTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>Payload
Tb4b4b4<Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>TimestampTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>ContentTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>TitleTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>FieldsTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ulTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72h5Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-and-these-rules" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#and-these-rules" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>And these rules:Tb4b4b4<Tb4b4b4/Tff7b72h5Tb4b4b4>
Tb4b4b4<Tff7b72olTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>A LXMF message is identified by it's Tb4b4b4<Tff7b72strongTb4b4b4>message-idTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>, which is a SHA-256 hash of the Tb4b4b4<Tff7b72strongTb4b4b4>DestinationTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>, Tb4b4b4<Tff7b72strongTb4b4b4>SourceTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> and Tb4b4b4<Tff7b72strongTb4b4b4>PayloadTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>. The message-id is never included directly in the message, since it can always be inferred from the message itself.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>In some cases the actual message-id cannot be inferred, for example when a Propagation Node is storing an encrypted message for an offline user. In theses cases a Tb4b4b4<Tff7b72emTb4b4b4>transient-idTb4b4b4<Tb4b4b4/Tff7b72emTb4b4b4> is used to identify the message while in storage or transit.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>Tb4b4b4<Tff7b72strongTb4b4b4>DestinationTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>, Tb4b4b4<Tff7b72strongTb4b4b4>SourceTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>, Tb4b4b4<Tff7b72strongTb4b4b4>SignatureTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> and Tb4b4b4<Tff7b72strongTb4b4b4>PayloadTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> parts are mandatory, as is the Tb4b4b4<Tff7b72strongTb4b4b4>TimestampTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> part of the payload.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>The Tb4b4b4<Tff7b72strongTb4b4b4>DestinationTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> and Tb4b4b4<Tff7b72strongTb4b4b4>SourceTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> fields are Reticulum destination hashesTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>The Tb4b4b4<Tff7b72strongTb4b4b4>SignatureTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> field is a RSA signature of the Tb4b4b4<Tff7b72strongTb4b4b4>DestinationTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>, Tb4b4b4<Tff7b72strongTb4b4b4>SourceTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>, Tb4b4b4<Tff7b72strongTb4b4b4>PayloadTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> and Tb4b4b4<Tff7b72strongTb4b4b4>message-idTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>The Tb4b4b4<Tff7b72strongTb4b4b4>PayloadTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> part is a list containing four items:
Tb4b4b4<Tff7b72olTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>The Tb4b4b4<Tff7b72strongTb4b4b4>TimestampTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> is a double-precision floating point number representing the number of seconds since the UNIX epoch.Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>The Tb4b4b4<Tff7b72strongTb4b4b4>ContentTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> is the optional content or body of the messageTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>The Tb4b4b4<Tff7b72strongTb4b4b4>TitleTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> is an optional title for the messageTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>The Tb4b4b4<Tff7b72strongTb4b4b4>FieldsTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> is an optional dictionaryTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72olTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ulTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>The Tb4b4b4<Tff7b72strongTb4b4b4>ContentTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>, Tb4b4b4<Tff7b72strongTb4b4b4>TitleTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> and Tb4b4b4<Tff7b72strongTb4b4b4>FieldsTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> parts must be included in the message structure, but can be left empty.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>The Tb4b4b4<Tff7b72strongTb4b4b4>FieldsTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> part can be left empty, or contain a dictionary of any structure or depth.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72olTb4b4b4>
Tb4b4b4<Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-usage-examples" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#usage-examples" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>Usage ExamplesTb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>LXMF offers flexibility to implement many different messaging schemes, ranging from human communication to machine control and sensor monitoring. Here's a few examples:Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>A messaging system for passing short, simple messages between human users, akin to SMS can be implemented using only the Tb4b4b4<Tff7b72strongTb4b4b4>ContentTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> field, and leaving all other optional fields empty.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>For sending full-size mail, an email-like system can be implemented using the Tb4b4b4<Tff7b72strongTb4b4b4>TitleTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> and Tb4b4b4<Tff7b72strongTb4b4b4>ContentTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> fields to store "subject" and "body" parts of the message, and optionally the Tb4b4b4<Tff7b72strongTb4b4b4>FieldsTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> part can be used to store attachments or other metadata.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>Machine-control messages or sensor readings can be implemented using command structures embedded in the Tb4b4b4<Tff7b72strongTb4b4b4>FieldsTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> dictionary.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>Distributed discussion or news-groups, akin to USENET or similar systems, can be implemented using the relevant fields and LXMF Propagation Nodes. Broadcast bulletins can be implemented in a similar fashion.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-propagation-nodes" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#propagation-nodes" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>Propagation NodesTb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>LXM Propagation Nodes offer a way to store and forward messages to users or endpoints that are not directly reachable at the time of message emission. Propagation Nodes can also provide infrastructure for distributed bulletin, news or discussion boards.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-the-lxm-router" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#the-lxm-router" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>The LXM RouterTb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>The LXM Router handles transporting messages over a Reticulum network, managing delivery receipts, outbound and inbound queues, and is the point of API interaction for client programs. The LXM Router also implements functionality for acting as an LXMF Propagation Node.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>Programatically, using the LXM Router to send a message is as simple as:Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"highlight highlight-source-python"Tb4b4b4>Tb4b4b4<Tff7b72preTb4b4b4>Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-k"Tb4b4b4>importTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4> Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-v"Tb4b4b4>LXMFTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-s1"Tb4b4b4>lxm_routerTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4> Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-c1"Tb4b4b4>=Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4> Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-v"Tb4b4b4>LXMFTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>.Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-v"Tb4b4b4>LXMRouterTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>()
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-s1"Tb4b4b4>messageTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4> Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-c1"Tb4b4b4>=Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4> Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-v"Tb4b4b4>LXMFTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>.Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-v"Tb4b4b4>LXMessageTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>(Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-s1"Tb4b4b4>destinationTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>, Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-s1"Tb4b4b4>sourceTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>, Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-s"Tb4b4b4>"This is a short, simple message."Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>)
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-s1"Tb4b4b4>lxm_routerTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>.Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-en"Tb4b4b4>handle_outboundTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>(Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"pl-s1"Tb4b4b4>messageTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>)Tb4b4b4<Tb4b4b4/Tff7b72preTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>The LXM Router then handles the heavy lifting, such as message packing, encryption, delivery confirmation, path lookup, routing, retries and failure notifications.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-transport-encryption" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#transport-encryption" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>Transport EncryptionTb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>LXMF uses encryption provided by Tb4b4b4<Tff7b72a Te6edf3hrefTff7b72=Ta5d6ff"https://github.com/markqvist/reticulum"Tb4b4b4>ReticulumTb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>, and thus uses end-to-end encryption by default. The delivery method of a message will influence which transport encryption scheme is used.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>A message can be delivered opportunistically, embedded in a single Reticulum packet. In this cases the message will be opportunistically routed through the network, and use Tb4b4b4<Tff7b72emTb4b4b4>RSA-1024Tb4b4b4<Tb4b4b4/Tff7b72emTb4b4b4> asymmetric encryption.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>If a message is delivered to the Reticulum GROUP destination type, the message will be transported using Tb4b4b4<Tff7b72emTb4b4b4>AES-128Tb4b4b4<Tb4b4b4/Tff7b72emTb4b4b4> encryption.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>If a message is delivered over a Reticulum link (which is the default method), the message will be encrypted with Tb4b4b4<Tff7b72emTb4b4b4>ephemeralTb4b4b4<Tb4b4b4/Tff7b72emTb4b4b4> keys derived with Tb4b4b4<Tff7b72emTb4b4b4>ECDHTb4b4b4<Tb4b4b4/Tff7b72emTb4b4b4> on the Tb4b4b4<Tff7b72emTb4b4b4>SECP256R1Tb4b4b4<Tb4b4b4/Tff7b72emTb4b4b4> curve. This mode offers Perfect Forward Secrecy.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-wire-format--overhead" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#wire-format--overhead" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>Wire Format Te6edf3& OverheadTb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>Assuming the default Reticulum configuration, the binary wire-format is as follows:Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>10 bytes destination hashTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>10 bytes source hashTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>128 bytes RSA signatureTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tff7b72liTb4b4b4>Remaining bytes of Tb4b4b4<Tff7b72a Te6edf3hrefTff7b72=Ta5d6ff"https://msgpack.org" Te6edf3relTff7b72=Ta5d6ff"nofollow"Tb4b4b4>msgpackTb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4> payload data, in accordance with the structure defined aboveTb4b4b4<Tb4b4b4/Tff7b72liTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ulTb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>The complete message overhead for LXMF is only 163 bytes, which in return gives you timestamped, digitally signed, infinitely extensible, end-to-end encrypted, zero-conf routed, minimal-infrastructure messaging that's easy to use and build applications with.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-caveat-emptor" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#caveat-emptor" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>Caveat EmptorTb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>As with Reticulum, LXMF is alpha software, and should be considered experimental. While it has been built with cryptography best-practices very foremost in mind, it Tb4b4b4<Tff7b72emTb4b4b4>has notTb4b4b4<Tb4b4b4/Tff7b72emTb4b4b4> been externally security audited, and there could very well be privacy-breaking bugs. If you want to help out, or help sponsor an audit, please do get in touch.Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3idTff7b72=Ta5d6ff"user-content-installation" Te6edf3classTff7b72=Ta5d6ff"anchor" Te6edf3hrefTff7b72=Ta5d6ff"#installation" Te6edf3aria-hiddenTff7b72=Ta5d6ff"true"Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3aria-hiddenTff7b72=Ta5d6ff"true" Te6edf3classTff7b72=Ta5d6ff"octicon octicon-link"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72aTb4b4b4>InstallationTb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72pTb4b4b4>If you want to try out LXMF, you can install it with pip:Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"highlight highlight-source-shell"Tb4b4b4>Tb4b4b4<Tff7b72preTb4b4b4>pip3 install lxmfTb4b4b4<Tb4b4b4/Tff7b72preTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72articleTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72bodyTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72htmlTb4b4b4>
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────